测试方面
- 功能测试
- 安装卸载测试
- 升级测试
- 兼容性测试[不同机型 系统]
- 网络切换,中断测试
- 横竖屏切换
- 健壮性
测试环境的搭建
需要配置的环境:
- java jdk java环境
- Android sdk 安卓环境
- python环境
- 第三库:appium
- 使用真机或模拟器进行测试【夜神模拟器】
环境搭建验证测试
模拟器或真机
在cmd中输入 adb devices 会返回ip地址和端口号
获取系统版本号输入 adb shell getprop ro.build.version.release
获取虚拟器里的app名称 adb shell dumpsys window windows | findstr mFocusedApp
{c361382 u0 com.android.settings/.Settings t9}}} /.后面是界面的名字 u0后 /.前是app名称
import time
from appium import webdriver
from selenium.webdriver.common.by import by #【利用by自动获取信息】
# 配置手机连接的参数信息
# 参数信息都是以键值对的方式进行连接
desired_caps = {}
# 设备的名称
desired_caps["deviceName"] = "127.0.0.1:62001"
# 系统
desired_caps["platformName"] = "Android"
# 系统版本号
desired_caps["platformVersion"] = "7.1.2"
# 启动的app名称
## com.android.settings
desired_caps["appPackage"] = "com.android.settings"
# 启动的app界面:.Settings
desired_caps["appActivity"] = ".Settings"
# print(desired_caps)
# 发送链接 用的appium的端口 用关键字传参
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_capabilities = desired_caps)
time.sleep(5)
driver.quit()
...
...
app自动化测试的流程
① 首先明确项目的核心模块
- 注册登录
- 阅读文章
- 搜索内容
- 发布评论
- 关注订阅
- 私信聊天
- 点赞等等
② 设计用例脚本
分析用例执行的步骤
- 进入app首页
- 点击我的界面
- 点击登录/注册
- 点击使用邮箱登录/注册
- 输入邮箱号
- 输入密码
- 点击登录
- 登录成功/失败
- 进行断言
自动截取虚拟器上界面的图片查看详情
D:\android_sdk_test\tools\uiautomatorviewer.bat
若两个 resource-id 定位是一样的那么就需要手写XPATH【resource-id必须唯一!!】
####### 这些都是线性脚本!!!
# 两个斜杠是代表当前界面所有的元素 增加个文本标识
driver.find_element(By.XPATH,'//*[@text="我的"]').click()
# 点击登录/注册
driver.find_element(By.ID,'io.manong.developerdaily:id/login_btn').click()
# 点击使用邮箱登录/注册 这里有报错是因为代码执行很快 但界面有延迟 需要加等待
time.sleep(2)
driver.find_element(By.ID,'io.manong.developerdaily:id/btn_email').click()
# 输入邮箱号
time.sleep(2)
driver.find_element(By.ID,'io.manong.developerdaily:id/edt_email').send_keys("zzz@qq.com")
# 输入密码
driver.find_element(By.ID,'io.manong.developerdaily:id/edt_email').send_keys("123123")
# 点击登录
driver.find_element(By.XPATH,'//*[@text="登录"]').click()
# 用户名是tata
try:
name_text = driver.find_element(By.XPATH,'io.manong.developerdaily:id/nav_tv_name').click()
if name_text == "tata":
print("登录成功")
# - 登录成功/失败
# - 进行断言
assert name_text == "tata"
except:
login_failed_msg = driver.find_element(By.XPATH,'io.manong.developerdaily:id/forgot').click()
print("登录失败")
assert login_failed_msg == "忘了密码?点此找回"
time.sleep(5)
...
...
若换了一个模块要重新截图 选取不同的app界面
这些用例测试属于冒烟测试的过程
Allure是一款灵活、轻量级的多语言测试报告工具,旨在生成美观且易于阅读的测试报告。它由Qameta Software团队开源,支持多种测试框架,如Pytest和TestNG等。Allure不仅可以快速查看测试结果,还能帮助团队成员清晰了解测试过程中的缺陷和问题。通过Allure,用户可以轻松集成测试用例,并生成统一格式的报告,提升测试的可读性和有效性。
总结梳理
核心业务流程梳理
- 需求分析
- 设计用例脚本
- 编写自动化测试脚本
- 将冒烟测试的脚本进行深度封装和模式设计
- 选择设计模式:
- POM设计模式
- KDT设计模式
- 引入测试框架pytest结合设计模式进行深度封装
- 执行过程中进行日志信息的记录log
- 执行完成之后自动化完成测试报告allure
- 持续集成Jenkins
- 选择设计模式:
- 将冒烟测试的脚本进行深度封装和模式设计
- 脚本维护以及迭代更新
app自动化测试的核心技能点:
Python + Appium + pytest + parametrize + csv + pom + log + Allure + Jenkins
项目梳理及描述
脚本执行的时候会直接发送给Appium服务器 执行py代码后 在Appium会执行许多adb的命令 再去控制手机 完成自动化测试【线性模块 正反例要跑通噢】
站在项目已经完成雏形的基础上,进行项目梳理和总结
整个项目中的文件解析
- 每个文件包和模块具体的使用规范
整个项目中的模块与文件之间的联系
- 各个模块及包之间的导入使用
整体从项目完成之后的角度触发去讲解项目搭建流程以及使用规范
搭建app自动化测试环境:
- 安卓sdk
- java的sdk
- 安装appium
- 使用真机或者安装手机模拟器
- 安装第三方库:Appium-Python-Client
编写自动化的用例线性脚本
新建一个项目
创建一个script脚本包
梳理核心业务模块和功能
- 登录
- 注册
- 点赞评论收藏
- 发布文章
- 浏览文章
- …
创建py模型进行线性脚本编写
- 通过核心业务流程模块梳理出线性脚本的执行步骤
- 然后通过编写自动化用例脚本执行完成第一轮正反例的冒烟测试
- 梳理被操作元素以及具体操作方法
- 执行正反例之后进行断言
- 保证自动化用例的准确性
若是那种本身图标没有id 没有任何标志的 比如点赞,收藏,评论 就可以直接通过坐标去定位【要考虑分辨率和坐标以及机型】
回归测试一般只需要正例脚本!!!
选择设计模式pom【Page Object Model页面对象模型的简称】
- 封装
- 一个类就是一个流程用例或者一个界面
- 将界面中需要被操作的每一个元素封装成类属性
- 将界面中需要被执行的用例步骤定义成一个实例方法
- 使用
- 创建页面类对象
- 通过对象调用方法执行用例步骤脚本
- 获取实际结果进行断言
- 整个页面封装
- 将线性文件进行封装
- 封装
引入测试框架结合用例执行以及管理
- 用例进行综合管理
- 使用参数化进行数据驱动测试:
@pytest.mark.parametrize("user_email, password, t_a_f",[ [" ", "123123", False], ["123@qq.com", "123123", True], ... ])- 一般情况在用例执行之前讲参数化使用的实参进行读取使用
- 数据量比较多的情况下会使用不同的文件格式存储数据
- Csv
- text
- Excel
- yaml
- JSON
- …
- 数据驱动测试主要核心就是在用例设计的过程中,把所有用例需要的正反例数据进行保存
- 然后再使用的时候进行读取自动化操作用例完成脚本内容
- 数据量比较多的情况下会使用不同的文件格式存储数据
日志信息的记录
缺陷报告的生成
持续集成的处理
单独执行某个用例(venv) D:\app_project>pytest -vsk test_login
有很多其他的需要保持登录的情况下进行测试 ↓
# 点赞评论及收藏
def test_like_comment_collect(go_login):
# 创建页面类对象
l_c_l_page = LikeCommentCollectPage(go_login)
# 通过对象调用方法执行用例步骤
l_c_l_page.execute_cases()
# 发布文章
def test_publish_article(go_login):...
# 浏览文章
def test_browse_article(go_login):...
Pywinauto基本介绍【基本解决找不到元素问题】
主要用于自动化图形用户界面,他提供了一组功能丰富的工具和方法,能够模拟用户的各种操作:点击,输入,文本,选择菜单栏等等…从而实现对Windows应用程序的自动化控制
pywinauto的基本特性
- 支持跨平台
- 强大的GUI自动化功能【用户交互图形界面】
- 简单易用
- 支持多种应用程序的类型
- 丰富的文档和社区支持
- 支持多种GUI框架
- 图像识别和模糊匹配
pywinauto应用场景
- 自动化测试
- ui自动化测试
- 数据录入和处理
- 窗口管理
- …
pywinauto的安装和使用
需要安装第三方库依赖:pywinauto
安装命令:【pycharm可以在某个项目下安装】pip install pywinauto
可以用pip list查看是否安装好了 pywinauto
pywinauto基本使用
案例:使用pywinauto编写自动化脚本,完成记事本的基本操作
操作流程:
- 打开记事本
- 点击帮助(关于记事本)
- 点击确定
- 输入内容
- 点击关闭记事本
- 点击不保存
# 导包
from pywinauto.application import Application
# 启动记事本 backend='uia'意思是连接记事本的后端是什么类型
# app = Application(backend='uia').start('notepad.exe')
app = Application(backend='win32').start('notepad.exe')
# 点击帮助(关于记事本) 使用快捷键完成打开关于记事本的信息 %是Alt符号 H:h A:a
app.Notepad.type_keys('%HA', pause=1)
# 点击确定 re正则匹配
dlg = app.window(title_re='关于记事本')
# 获取窗口的界面元素信息 【关于记事本的元素架构】
dlg.print_control_identifiers()
# 点击 不直接调用click是要运用鼠标真实的模拟
time.sleep(1)
dlg['确定Button'].click_input()
# 输入内容
app.Notepad.type_keys('xx教育')
# 点击关闭记事本
# 菜单栏选择 ->表示子菜单
app.Notepad.menu_select("文件(&F)->退出(&X)")
# 点击不保存
app.window(title_re='记事本').window(title_re='不保存').cli